Oculus開発で5GB以上のアセットデータを扱う方法

February 20, 2023


※ この記事の内容について。 実際にリリースまで持って行けていないため実際のストアでは未検証です。

開発環境

  • Unity 2022.2.7f1
  • Oculus Quest2

現状開発中のOculus用アプリの容量が約10GBほどになると判明。 内容は動画ファイルがほとんどなため最適化による削減は難しいです。

APK自体を10GBにすることは出来ませんが、Oculusでは約10GB近いアプリも存在しています。 (バイオ4 VR をストアで見たとき約8.8GBと記載がありました)

手段はあると思いこのあたりを調べてみました。

※ 今回の実装にあたり以下のForumが参考になりました https://forum.unity.com/threads/combining-addressable-with-oculus-expansion-files.734858/

Oculusガイドライン

Questバーチャルリアリティチェック(VRC)ガイドライン に以下の項目がありました

VRC.Quest.Packaging.5 https://developer.oculus.com/resources/vrc-quest-packaging-5/

APKファイルは1GB未満である必要がありますが、それぞれ最大4GBの複数の拡張ファイルを付属させることができます。

ここから

  • APKは最大1GB
  • 最大4GBの複数の拡張ファイルを付属させることが出来る
  • APKファイルは1GB未満であり、各OBBファイルは4GB未満である。

がわかります。 つまり1GBを超えるAPKは作れないため、もしそれを超える場合はアセットは別ファイルとする必要があります

OBBファイル(Opaque Binary Blob)は、APKの制限を超えて追加できる拡張ファイルのこと。 昔APKをGooglePlayStoreに申請するとき APK + OBB をまとめて提出していた ( 現在はGooglePlayStoreでは APK + OBB の形式は申請できません )

次に Oculus 公式のDocumentを見てみます

ダウンロードサイズを管理するためのアセットファイル https://developer.oculus.com/documentation/unity/ps-assets/

以下の記載があります

OBB拡張ファイル - モバイルアプリには、サイズが最大4 GBのopaque binary blob (OBB)形式の拡張ファイルを1つ含めることができます。このファイルはインストール時に自動的にダウンロードされます。
必要なアセットファイル - モバイルアプリは、OBB形式を含むほぼすべての形式の複数の一般アセットファイルを提供できます。必須アセットとしてマークすると、これらのアセットはインストール時にダウンロードされます。

そしてOBBについても触れています

  • OBB拡張ファイルのサイズは最大4 GBです。このファイルは、アプリのインストール時に自動的にダウンロードおよびインストールされます。
  • ファイルにはアップロード時に任意の名前を付けることができ、main.[package-name].[version-code].obb

という形式で名前が変更されます。アセットファイルシステムは、ファイル名を使用して、ユーザーのヘッドセットでOBB拡張ファイルを更新するかどうかを決定します。

  • ファイルは、ユーザーのデバイスの/sdcard/Android/obb/[package-name]

フォルダーにインストールされます。インストール場所でファイルにアクセスできます。

OBB形式を利用する場合

  • サイズ
  • ファイル名
  • ファイル格納箇所

に注意する必要があります

コレまでから、アプリ容量が 5GB未満 (APK 1GB, OBB 4GB ) であればこの形式に則れば申請できそうです。

Unityでは Project Settings > Player > Android から Split Application Binary にチェックを入れることで自動的に APK + OBB に分割してくれます。

2C8AAD988CCE9F24E65D2235C3DCA44D

しかし総量が 5GB 以上を超える場合Unityは** 1GB未満のAPK と 4GBを超えたOBBを生成します** つまりコレではOculusのガイドラインに則っていないため申請ができません。

(ちなみにUnrealEngineでは一つのOBBを 4GB 未満に抑え、更に複数のOBBファイルに分割するビルドが可能です。 Unityでは複数OBBへの分割は未対応。 https://forum.unity.com/threads/how-do-i-multiple-obb.1156817/

もし5GBを超える場合アセットバンドルを利用する必要があります。

ビルドしたアセットバンドルをサーバーに乗せる通常の方法ももちろんありですが 今回はサーバー費用も抑えたかったため Oculus内にアセットバンドルを格納して参照する方法を探しました。

Addressable Asset Systemについて

Addressable Asset System に付いては以下の記事等を参考にしてください。 (とても参考になりました..!!!!)

Addressable Assets Systemをちゃんと導入するための技術検証まとめ https://blog.applibot.co.jp/2020/06/15/introduce-addressable-assets-system/ └ Addressableについて詳しく説明

サーバーに置く場合

  • Google Cloud Storage
  • Amazon S3

などの選択肢がありますが

  • DigitalOcean

のクラウドストレージは費用が安く個人開発にはおすすめできます。

【その他】 もしサーバーにアセットバンドルをおいて管理する場合は以下のようなエラーハンドリングを忘れないように。

【Unity】【Addressables】ダウンロード時のエラーをハンドリングする https://light11.hatenadiary.com/entry/2022/08/02/192445

【Unity】Addressables でリモートカタログのダウンロードの通信に失敗したか確認する例 https://baba-s.hatenablog.com/entry/2022/01/17/150000

【Unity】【Addressable】ストレージ容量不足で書き込みが失敗するエラーをハンドリングする https://light11.hatenadiary.com/entry/2022/08/04/191313

Document https://docs.unity3d.com/Packages/com.unity.addressables@1.21/manual/runtime/LoadingAssetBundles.html

AssetBundleのビルド

AddressableAssetBundleをビルドする前に、リモート利用時のパスを変更します。

Oculusの場合、APK以外の拡張ファイルは sdcard/Android/obb/[パッケージ名] に配置されます。

つまり、AddressableAssetBundleの向き先を上記にしてビルドすればAPKから参照ができるようになります。

Profile

Window > Asset Management > Addressable > Profiles でProfileを開く。

Defaultが選択されていると思います。 28651D63C27C1E6D5AA731DBB7ECF789

Remote 欄をCustomにし、Remove Local Path を変更します。 sdcard/Android/obb/[パッケージ名]

各種Group

Groupの向き先を変更します E6DC48F254EA52C649B9F24CCD37FBF6

Addressable Asset Group の Build & Local Paths を に変更し

BuildPathはそのまま。LoadPathを にして sdcard/Android/obb/[パッケージ名] に変更 3EE79D5E6121C8C359A5DBD3E4DBAF3A

これでAssetBundleをビルドして、APKも作成します。

AssetBundleビルド後、 ServerData 配下にある catalog_**.json を見ると パスが正しく設定されていることが確認できます。

また、APKをzipに変換して内部を覗き、 settings.json を見ると AddressablesMainContentCatalogRemoteHashsdcard/Android/obb/[パッケージ名] になっていることが確認できます。

Oculus内部にAssetBundleを置く

まず、OculusにAPKのインストールとアセットバンドルを置くためにSideQuestを利用します。

出来上がったAPKはドラッグアンドドロップするだけでインストールされます FDCA30B7A3C17D28BAF12B787F6D7CB3

AssetBundleは File Manager から BA63B5D44590F1AFC90E25B0814D2104

Android > obb > [パッケージ名] の下に配置します。パッケージ名のフォルダがない場合は作成してください。 ビルドした ServerData 配下のアセットバンドルをドラッグアンドドロップで転送…

これでOculusからAPKを起動するとAssetBundleが正しく読み込まれます。

実際にStoreにアップロードする際は公式を参考してください https://developer.oculus.com/documentation/unity/ps-assets/#unity-support

最後に

以上が Oculus + Unity で5GB以上のアセットデータを扱う方法でした。 Oculus公式のForumはあまり活発でないのか質問の答えが無いものが多く解決に時間がかかりました…

実際にStoreに上げるときに問題が出る可能性はあるため、ローカル環境で成功したからといえ注意が必要です。

Storeに上げて結果が出たら追記します。